<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //如何从外部读取局部变量n？执行f1(),弹出111
        // function f1() {
        //     var n = 111;
        //     return function f2() {
        //         alert(n);
        //     }
        // }

        //自执行函数
        // function f1() {
        //     var n = 111;
        //     (function f2(i) {
        //         alert(i);
        //     })(n)//传参
        // }
        // f1();

        //闭包
        // function f1() {
        //     var n = 111;
        //     function f2() {
        //         alert(n);
        //     }
        //     return f2 //闭包，内部函数可以访问外部函数的变量
        // }
        // f1()()


        // ---------------------------------------------------------------------------------------


        //给出输出结果
        // for (var i = 1; i <= 3; i++) { //同步
        //     setTimeout(function () { //异步
        //         console.log(i);   //4,4,4
        //     }, 0);
        // }

        //如何让上述代码输出1 2 3  看下面

        // 自执行函数法
        // for (var i = 1; i <= 3; i++) {
        //     (function (a) {
        //         setTimeout(function () {
        //             console.log(a);
        //         }, 0)
        //     })(i)
        // }

        // 声明变量用let
        // for (let i = 1; i <= 3; i++) {
        //     setTimeout(function () {
        //         console.log(i);
        //     }, 0)
        // }



        //------------------------------------------------------------------------------------



        // for (var i = 0; i <= 5; i++) {  //同步，i变成6
        //     ((a) => {
        //         setTimeout(() => {  
        //             console.log(a);   // 异步 0,1,2,3,4,5 从0开始是间隔1秒执行  
        //         }, a * 1000)
        //     })(i)
        // }
        // console.log(i); //同步6  



    // 闭包总结：
	// 闭包说的通俗⼀点就是打通了⼀条在函数外部访问函数内部作⽤域的通道。正常情况下函数外部是访问不到函数内部作⽤域变量的，
	// 如何判断是不是闭包: 函数嵌套函数, 内部函数被return，内部函数调⽤外层函数的局部变量
	// 优点：可以隔离作⽤域，不造成全局污染
	// 缺点：由于闭包⻓期驻留内存，则⻓期这样会导致内存泄露
	// 如何解决内存泄露：将暴露在外部的闭包变量置为null
    </script>
</body>

</html>